import java.util.Iterator;
import java.util.LinkedList;

class DFS1 {
	// 图的顶点数量
	private int v;
	// 邻接表数组
	private LinkedList<Integer> adj[];
	
	// 构造函数，初始化图的顶点数量和邻接表
	DFS1(int v) {
		// 使用 this.v 给类的成员变量 v 赋值
		this.v = v;
		adj = new LinkedList[v];
		for (int i = 0; i < v; ++i) {
			adj[i] = new LinkedList<>();
		}
	}
	
	// 添加边的方法
	void addEdge(int v, int w) {
		adj[v].add(w);
	}
	
	// 深度优先搜索的辅助方法
	void Dfsutil(int v, boolean visited[]) {
		visited[v] = true;
		System.out.print(v + " ");
		
		Iterator<Integer> i = adj[v].listIterator();
		while (i.hasNext()) {
			int n = i.next();
			if (!visited[n])
				Dfsutil(n, visited);
		}
	}
	
	// 深度优先搜索的主方法
	void DFS(int v) {
		// 使用 this.v 初始化 visited 数组
		boolean visited[] = new boolean[this.v];
		Dfsutil(v, visited);
	}
	
	public static void main(String[] args) {
		// 创建一个包含 4 个顶点的图
		DFS1 g = new DFS1(4);
		
		// 添加边
		g.addEdge(0, 1);
		g.addEdge(0, 2);
		
		// 从顶点 0 开始进行深度优先搜索
		g.DFS(0);
	}
}